package com.itany.corejava.code06_面向对象;

/**
 * @author 石小俊
 * @date 2024年01月15日 16:37
 */
public class Test09_对象的初始化顺序 {
    public static void main(String[] args) {
        System.out.println("************************对象所在的类被加载************************");
        Dept.id = 2;
        System.out.println("************************对象被创建************************");
        Dept dept = new Dept();
        System.out.println("************************再次创建对象************************");
        Dept dept2 = new Dept();
        System.out.println("************************调用方法************************");
        dept.show();
    }
}

class Dept{
    // 代码块
    static{
        // 静态代码块中只能访问静态属性和方法,不能访问实例属性和方法
        // 其执行顺序是从上往下,从左往右
        // 在执行到该行代码时,id还没有被加载,因此报错
        // System.out.println("这是静态代码块1id:"+id);
        System.out.println("这是静态代码块1");
        // print();
    }

    // 构造方法
    // 构造方法的执行时机一定在代码块之后
    public Dept() {
        System.out.println("构造方法");
    }
    {
        // 在代码块中,可以初始化实例属性
        name = "研发部";
        System.out.println("代码块");
    }


    // 属性
    String name;
    static int id;

    // 方法
    public void show(){
        System.out.println("这是普通方法");
    }

    public static void print(){
        System.out.println("这是静态方法");
    }


    static{
        // 执行到此处是,id已经被加载
        System.out.println("这是静态代码块3,id:"+id);
    }
    static{
        // 初始化静态属性
        id = 1;
        System.out.println("这是静态代码块2");
    }

}
